GdkWindowX11: Prevent non renderered window to be display by the compositor
authorLionel Landwerlin <llandwerlin@gmail.com>
Thu, 13 Jun 2013 15:36:56 +0000 (16:36 +0100)
committerLionel Landwerlin <llandwerlin@gmail.com>
Thu, 26 Sep 2013 21:16:53 +0000 (22:16 +0100)
When mapping a window for the first time, make sure the compositor
won't display it until we're done painting.

https://bugzilla.gnome.org/show_bug.cgi?id=702196

gdk/x11/gdkwindow-x11.c

index a5c4507cb629d99dc845a736891c87e74d3a38fc..fd6fbdfb2f6953fa7dc10e144dafee1d8665fb26 100644 (file)
@@ -325,7 +325,8 @@ gdk_x11_window_predict_presentation_time (GdkWindow *window)
 }
 
 static void
-gdk_x11_window_begin_frame (GdkWindow *window)
+gdk_x11_window_begin_frame (GdkWindow *window,
+                            gboolean   force_frame)
 {
   GdkWindowImplX11 *impl;
 
@@ -350,6 +351,13 @@ gdk_x11_window_begin_frame (GdkWindow *window)
 
       window_pre_damage (window);
     }
+  else if (force_frame)
+    {
+      /* When mapping the window, we really want to freeze the
+         rendering of the window by the compositor until we've
+         actually painted something into the window's buffer. */
+      window_pre_damage (window);
+    }
   else
     {
       hook_surface_changed (window);
@@ -945,7 +953,7 @@ setup_toplevel_window (GdkWindow *window,
   ensure_sync_counter (window);
 
   /* Start off in a frozen state - we'll finish this when we first paint */
-  gdk_x11_window_begin_frame (window);
+  gdk_x11_window_begin_frame (window, TRUE);
 }
 
 static void
@@ -953,7 +961,7 @@ on_frame_clock_before_paint (GdkFrameClock *clock,
                              GdkWindow     *window)
 {
   gdk_x11_window_predict_presentation_time (window);
-  gdk_x11_window_begin_frame (window);
+  gdk_x11_window_begin_frame (window, FALSE);
 }
 
 static void